perm filename PRETTY.RUT[WD,LSP] blob sn#265661 filedate 1977-02-18 generic text, type T, neo UTF8
 
 
(DECLARE (SPECIAL PRETTYPROPS PRETTYFLG COMMENTCOL COMMENTFLG %%LL %%BR %%CC %%T
		  %%LP %%RP)
	 (NOCALL %SPRINT)
	 (DM * (%L) NIL))
 
(PUTPROP @* (GET @NILL @FSUBR) @FSUBR)
 
(DEFPROP %CURRCOL
 (LAMBDA (L)
  				       (* Returns the column where the next
					  printed character will appear; Made
					  into a macro because it is called so
					  frequently)
  @(ADD1 (*DIF %%LL (CHRCT))))
MACRO)
 
(DEFPROP PPL
 (LAMBDA (%L)
  				       (* Replaces GRINL)
  (MAPC (FUNCTION (LAMBDA (%A)
		   (OR [MEMB %A (SETQ %L (EVAL %A))] [NCONC %L (LIST %A)])
		   (APPLY# @PP %L)))
	%L))
FEXPR)
 
(DEFPROP PPL*
 (LAMBDA (%L)
  (PROG (COMMENTFLG)
	(SETQ COMMENTFLG T)
	(APPLY# @PPL %L)))
FEXPR)
 
(DEFPROP PP
 (LAMBDA (%L)
  				       (* Replaces GRINDEF; Outputs page eject
					  if *PAGE* encountered; Notifies user
					  of any atoms with no props on
					  PRETTYPROPS if dumping to a file)
  (PROG (%F %FLAG %D)
	(SETQ %F (OUTCH))
	(MAPC
	 (FUNCTION
	  (LAMBDA (%A)
	   (COND
	    [(CONSP %A)
	     (TERPRI)
	     (TERPRI)
	     (COND [(AND [CONSP (CAR %A)] [EQ (CAAR %A) @LAP])
		    (PRIN1 (CAR %A))
		    (MAPC (FUNCTION (LAMBDA (X)
				     (TAB (COND [(AND X [ATOM X]) 2Q] [T 11Q]))
				     (SETQ %A (PRIN1 X))))
			  (CDR %A))
		    (COND [%A (TAB 11Q) (PRIN1 NIL)])]
		   [T (SPRINT %A 1Q)])]
	    [(EQ %A @*PAGE*) (TYO 14Q)]
	    [T (SETQ %FLAG NIL)
	       (MAPC
		(FUNCTION
		 (LAMBDA (%P)
		  (PROG (%SP)
			(COND [(CONSP %P)
			       (SETQ %SP (CDR %P))
			       (SETQ %P (CAR %P))])
			(COND
			 [(AND
			   [SETQ %D (GET %A %P)]
			   [OR [PATOM %D]
			       [COND [(AND [MEMB %P @(EXPR FEXPR MACRO)]
					   [SETQ %L (GET %A @TRACE)])
				      (AND [SETQ %L
						 (GETL (CDR %L)
						       @(EXPR FEXPR MACRO))]
					   [SETQ %D (CADR %L)])]
				     [(NEQ (CDR %D) (UNBOUND))]]])
			  (SETQ %FLAG T)
			  (TERPRI)
			  (TERPRI)
			  (COND [%SP (%SP %A %D %P)]
				[(OR [ATOM %D]
				     [AND [ATOM (CAR %D)] [ATOM (CDR %D)]])
				 (SPRINT (LIST @DEFPROP %A %D %P) 1Q)]
				[T (PRINC @/(DEFPROP/ )
				   (PRIN1 %A)
				   (SPRINT %D 2Q)
				   (TERPRI)
				   (PRIN1 %P)
				   (PRINC @/))])]))))
		PRETTYPROPS)
	       (COND [(AND %F [NULL %FLAG])
		      (OUTC NIL NIL)
		      (AND [LESSP (CHRCT) 17Q] [TERPRI])
		      (PRINC @/ )
		      (PRIN1 %A)
		      (OUTC %F NIL)])])))
	 %L)
	(TERPRI)))
FEXPR)
 
(DEFPROP PP*
 (LAMBDA (%L)
  (PROG (COMMENTFLG)
	(SETQ COMMENTFLG T)
	(APPLY# @PP %L)))
FEXPR)
 
(DEFPROP PP-RMACS
 (LAMBDA (%A %D %P)
  (SETQ %P (SETCHR %A NIL))
  (SPRINT (LIST (COND [(EQ %P 13Q) @DSM] [T @DRM]) %A %D) 1Q))
EXPR)
 
(DEFPROP SPRINT
 (LAMBDA (%E %C)
  				       (* SPRINT now does a quick dump if
					  PRETTYFLG=NIL)
  (SETQ %%LL (LINELENGTH NIL))
  (TAB %C)
  (COND [(OR [NULL PRETTYFLG] [ATOM %E]) (PRIN1 %E)] [T (%SPRINT %E NIL)]))
EXPR)
 
(DEFPROP %SPRINT
 (LAMBDA (%E %BR)
  				       (* Prettyprints the <non-atomic>
					  structure %E using parentheses if
					  %BR=NIL and brackets if %BR=T; Checks
					  for printmacros and lists of atoms
					  <printed as blocks>)
  (PROG (%C %CE)
	(COND [%BR (SETQ %%LP @/[) (SETQ %BR (SETQ %%RP @/]))]
	      [T (SETQ %%LP @/() (SETQ %BR (SETQ %%RP @/)))])
  START	(SETQ %C (ADD1 (%CURRCOL)))
	(COND [(CONSP (SETQ %CE (CAR %E)))
	       (PRINC %%LP)
	       (%SPRINT %CE NIL)
	       (SETQ %%BR NIL)]
	      [(AND [LITATOM %CE] [SETQ %%T (GET %CE @PRINTMACRO)])
	       (COND [(STRINGP %%T)
		      (PRINC %%T)
		      (COND [(NULL (CDR %E)) (RETURN NIL)]
			    [(ATOM (SETQ %E (CADR %E))) (RETURN (PRIN1 %E))]
			    [T (GO START)])]
		     [(EQ %%T @BRACKETS) (PRINC %%LP) (PRIN1 %CE) (SETQ %%BR T)]
		     [T (RETURN (%%T %E))])]
	      [T (PRINC %%LP) (PRIN1 %CE) (SETQ %%BR NIL)])
	(COND [(ATOM (SETQ %E (CDR %E))) (PP-LSEG %E %C %C %%BR)]
	      [(MINUSP (SETQ %%T (%PPSIZE %CE (*DIF %%LL %C) T)))
	       (PP-LSEG %E %C %C %%BR)]
	      [(NOT (MINUSP (%PPSIZE %E (SETQ %%CC (CHRCT)) NIL)))
	       (PP-LSEG %E NIL NIL %%BR)]
	      [(AND [ATOM %CE]
		    [PROG (%E1)
			  (SETQ %E1 %E)
			A (COND [(CONSP (CAR %E1)) (RETURN NIL)]
				[(ATOM (SETQ %E1 (CDR %E1))) (RETURN T)]
				[T (GO A)])])
	       (PP-LSEG %E NIL (ADD1 (%CURRCOL)) %%BR)]
	      [(OR [*GREAT (SETQ %%T (DIFFERENCE %%LL %C %%T)) 14Q]
		   [CONSP %CE]
		   [AND [*GREAT %%T 1Q] [*GREAT (*TIMES 6Q (%DEPTH %E)) %%CC]])
	       (PP-LSEG %E %C %C %%BR)]
	      [T (PRINC @/ ) (PP-LSEG %E (SETQ %CE (%CURRCOL)) %CE %%BR)])
	(AND [ZEROP (CHRCT)] [TAB %C])
	(PRINC %BR)))
EXPR)
 
(DEFPROP %DEPTH
 (LAMBDA (%S)
  				       (* Returns the maximum nesting depth of
					  the list structure %S)
  (PROG (%N)
	(SETQ %N 1Q)
   LOOP	(AND [CONSP (CAR %S)] [SETQ %N (*MAX %N (ADD1 (%DEPTH (CAR %S))))])
	(COND [(CONSP (SETQ %S (CDR %S))) (GO LOOP)] [T (RETURN %N)])))
EXPR)
 
(DEFPROP PP-LSEG
 (LAMBDA (%L %C1 %C2 %BR)
  				       (* Prints the list-segment %L; %C1 gives
					  column to print lists in; %C2 gives
					  column to print atoms in <if %C2 is
					  NIL atoms are automatically indented>;
					  if %C1 is NIL the elements are printed
					  as a block <%C2 then gives the column
					  to resume printing if an element won't
					  fit on the line>; %BR is the bracket
					  flag to pass to %SPRINT)
  (PROG NIL
   LOOP	(COND [(ATOM %L) (GO DONE)]
	      [(NULL %C1)
	       (COND [(AND %C2 [MINUSP (%PPSIZE (CAR %L) (SUB1 (CHRCT)) T)])
		      (TAB %C2)]
		     [T (PRINC @/ )])
	       (COND [(ATOM (CAR %L)) (PRIN1 (CAR %L))]
		     [T (%SPRINT (CAR %L) %BR)])]
	      [(ATOM (CAR %L))
	       (TAB (OR %C2 [*MAX 2Q (SUB1 (*DIF %C1 (FLATSIZE (CAR %L))))]))
	       (PRIN1 (CAR %L))
	       (PRINC @/ )]
	      [T (TAB %C1) (%SPRINT (CAR %L) %BR)])
	(SETQ %L (CDR %L))
	(GO LOOP)
   DONE	(COND [%L (AND [*LESS (CHRCT) (*PLUS (FLATSIZE %L) 3Q)]
		       [TAB (OR %C1 %C2)])
		  (PRINC @" . ")
		  (PRIN1 %L)])))
EXPR)
 
(DEFPROP %PPSIZE
 (LAMBDA (%E %N %F)
  				       (* Checks to see if %E can be SPRINTed in
					  %N spaces; Returns negative number if
					  it can't; Returns number of spaces
					  left over if it can; %F is T if %E is
					  a real expression <a check is then
					  made for a printmacro function - they
					  are assumed not to fit>; If %F is NIL
					  %E is a segment <no top-level check
					  for printmacro>)
  (PROG NIL
  START	(COND [(ATOM %E) (RETURN (*DIF %N (FLATSIZE %E)))]
	      [(AND %F [LITATOM (CAR %E)] [SETQ %F (GET (CAR %E) @PRINTMACRO)])
	       (COND [(STRINGP %F)
		      (SETQ %N (*DIF %N (FLATSIZEC %F)))
		      (COND [(CDR %E) (SETQ %E (CADR %E)) (GO START)]
			    [T (RETURN %N)])]
		     [(NEQ %F @BRACKETS) (RETURN -1Q)])])
	(SETQ %N (SUB1 (*DIF %N (LENGTH %E))))
   LOOP	(COND [(MINUSP %N) (RETURN %N)] [T (SETQ %N (%PPSIZE (CAR %E) %N T))])
	(COND [(CONSP (SETQ %E (CDR %E))) (GO LOOP)]
	      [(NULL %E) (RETURN %N)]
	      [T (RETURN (DIFFERENCE %N (FLATSIZE %E) 3Q))])))
EXPR)
 
(DEFPROP PP-BLOCK
 (LAMBDA (%L %C)
  				       (* Prints the list %L as a block; resumes
					  printing in column %C when an element
					  of %L won't fit on the line)
  (COND [(ATOM %L) (PRIN1 %L)]
	[T (PRINC @/()
	   (SPRINT (CAR %L) (%CURRCOL))
	   (PP-LSEG (CDR %L) NIL %C NIL)
	   (AND [ZEROP (CHRCT)] [TAB %C])
	   (PRINC @/))]))
EXPR)
 
(DEFPROP PP-FORMAT
 (LAMBDA (%L %N %F)
  				       (* Formats the list %L with the first
					  %N+1 elements <the function name and
					  %N arguments> printed as a block; %F
					  specifies how the rest of the list
					  <the body> will be printed: if %F=NIL
					  <standard format> all elements will be
					  printed under the first argument; if
					  %F=LABELS all non-atomic expressions
					  will be printed under the first
					  argument with atoms placed to the left
					  <as labels>; if %F=MISER all elements
					  will be printed under the function
					  name)
  (PROG (%C1 %C2 %RP)
	(SETQ %RP %%RP)
	(PRINC %%LP)
	(SETQ %C1 (%CURRCOL))
	(PRIN1 (CAR %L))
	(SETQ %C2 (ADD1 (%CURRCOL)))
	(PP-LSEG (SETQ %N (LDIFF (CDR %L) (SETQ %L (NTH (CDDR %L) %N))))
		 NIL
		 (ADD1 %C2)
		 NIL)
	(PP-LSEG %L
		 (COND [(EQ %F @MISER) %C1] [T %C2])
		 (COND [(NULL %F) %C2] [(EQ %F @MISER) %C1])
		 NIL)
	(AND [ZEROP (CHRCT)] [TAB %C1])
	(PRINC %RP)
	(AND %L [FREELIST (PROG1 %N (SETQ %N NIL))])))
EXPR)
 
(DEFPROP * %* PRINTMACRO)
 
(DEFPROP %*
 (LAMBDA (%L)
  				       (* This is the comment printer)
  (COND [(EQ (CADR %L) @E) (EVAL (CADDR %L))])
  (COND [(OR [OUTCH] COMMENTFLG)
	 (TAB COMMENTCOL)
	 (PP-BLOCK %L (*PLUS COMMENTCOL 3Q))]
	[T (PRINC @"(* ...)")]))
EXPR)
 
(DEFPROP LAMBDA PP-LAMBDA PRINTMACRO)
 
(DEFPROP PP-LAMBDA
 (LAMBDA (%L)
  (PP-FORMAT %L 1Q @MISER))
EXPR)
 
(DEFPROP PROG PP-PROG PRINTMACRO)
 
(DEFPROP PP-PROG
 (LAMBDA (%L)
  (PP-FORMAT %L 1Q @LABELS))
EXPR)
 
(DEFPROP QUOTE "@" PRINTMACRO)
 
(DEFPROP COND BRACKETS PRINTMACRO)
 
(DEFPROP SELECTQ BRACKETS PRINTMACRO)
 
(DEFPROP CATCH BRACKETS PRINTMACRO)
 
(DEFPROP AND BRACKETS PRINTMACRO)
 
(DEFPROP OR BRACKETS PRINTMACRO)
 
(DEFPROP PRETTYFLG (NIL . T) VALUE)
 
(DEFPROP COMMENTCOL (NIL . 50Q) VALUE)
 
(DEFPROP COMMENTFLG (NIL) VALUE)
 
(DEFPROP PRETTYPROPS
 (NIL SPECIAL EXPR FEXPR MACRO VALUE PRINTMACRO (READMACRO . PP-RMACS))
VALUE)
 
(PROGN 				       (* In case someone gets cute and calls
					  %SPRINT or PP-FORMAT directly instead
					  of going thru SPRINT)
       (SETQ %%LL (LINELENGTH NIL))
       (SETQ %%LP @/()
       (SETQ %%RP @/)))
 
(PROGN 				       (* Set up names for GRINers)
       (SETQ %%T (GETL @PP @(FEXPR FSUBR)))
       (PUTPROP @GRINDEF (CADR %%T) (CAR %%T))
       (SETQ %%T (GETL @PPL @(FEXPR FSUBR)))
       (PUTPROP @GRINL (CADR %%T) (CAR %%T))
       (REMPROP @GRINPROPS @VALUE)
       (PUTPROP @GRINPROPS (GET @PRETTYPROPS @VALUE) @VALUE)
       @(GRINDEF GRINL GRINPROPS))
 
(DEFPROP PPFNS
 (PPFNS (DECLARE (SPECIAL PRETTYPROPS PRETTYFLG COMMENTCOL COMMENTFLG %%LL %%BR
			  %%CC %%T %%LP %%RP)
		 (NOCALL %SPRINT)
		 (DM * (%L) NIL))
	(PUTPROP @* (GET @NILL @FSUBR) @FSUBR)
	%CURRCOL
	PPL
	PPL*
	PP
	PP*
	PP-RMACS
	SPRINT
	%SPRINT
	%DEPTH
	PP-LSEG
	%PPSIZE
	PP-BLOCK
	PP-FORMAT
	*
	%*
	(DEFPROP LAMBDA PP-LAMBDA PRINTMACRO)
	PP-LAMBDA
	(DEFPROP PROG PP-PROG PRINTMACRO)
	PP-PROG
	(DEFPROP QUOTE "@" PRINTMACRO)
	(DEFPROP COND BRACKETS PRINTMACRO)
	(DEFPROP SELECTQ BRACKETS PRINTMACRO)
	(DEFPROP CATCH BRACKETS PRINTMACRO)
	(DEFPROP AND BRACKETS PRINTMACRO)
	(DEFPROP OR BRACKETS PRINTMACRO)
	PRETTYFLG
	COMMENTCOL
	COMMENTFLG
	PRETTYPROPS
	(PROGN 			       (* In case someone gets cute and calls
					  %SPRINT or PP-FORMAT directly instead
					  of going thru SPRINT)
	       (SETQ %%LL (LINELENGTH NIL))
	       (SETQ %%LP @/()
	       (SETQ %%RP @/)))
	(PROGN 			       (* Set up names for GRINers)
	       (SETQ %%T (GETL @PP @(FEXPR FSUBR)))
	       (PUTPROP @GRINDEF (CADR %%T) (CAR %%T))
	       (SETQ %%T (GETL @PPL @(FEXPR FSUBR)))
	       (PUTPROP @GRINL (CADR %%T) (CAR %%T))
	       (REMPROP @GRINPROPS @VALUE)
	       (PUTPROP @GRINPROPS (GET @PRETTYPROPS @VALUE) @VALUE)
	       @(GRINDEF GRINL GRINPROPS))
	PPFNS)
VALUE)

.